// 从axios框架导入axios组件
import axios from "axios";

import {getTokenName, messageTip, removeToken} from "../util/util.js";
import {ElMessageBox} from "element-plus";

// 定义后端接口地址的前缀
axios.defaults.baseURL = "http://127.0.0.1:8089"

// 在其它页面要使用这个方法，所以需要export
export function doGet(url, params) {
    return axios({
        method: "get",
        url: url,
        params: params,     // 注意：get请求的参数使用params接收
        dataType: "json"
    })
}

// 在其它页面要使用这个方法，所以需要export
export function doPost(url, data) {
    return axios({
        method: "post",
        url: url,
        data: data,         // 注意：post请求的参数使用data接收
        dataType: "json"
    })
}

// 在其它页面要使用这个方法，所以需要export
export function doPut(url, data) {
    return axios({
        method: "put",
        url: url,
        data: data,         // 注意：put请求的参数使用data接收
        dataType: "json"
    })
}

// 在其它页面要使用这个方法，所以需要export
export function doDelete(url, params) {
    return axios({
        method: "delete",
        url: url,
        params: params,     // 注意：delete请求的参数使用params接收
        dataType: "json"
    })
}

/**
 * 添加请求拦截器
 */
axios.interceptors.request.use( (config) => {
    // 发送请求之前要做的事

    // 从sessionStorage中获取登录token
    let token = window.sessionStorage.getItem(getTokenName());

    // !token表示token不存在，token是空的，token没有值
    if (!token) {
        // 那么就从localStorage中获取登录token
        token = window.localStorage.getItem(getTokenName());
        // 添加请求头，根据用户是否勾选了记住我，来判断是否刷新token
        if (token) {
            config.headers['rememberMe'] = true;
        }
    }

    // token表示token存在，token不是空的，token有值
    if (token) {
        // 在请求头中放一个token，后端就可以从请求头中接收到该token
        config.headers['Authorization'] = token;
    }

    return config;
}, (error) => {
    // 请求错误之后执行的代码
    return Promise.reject(error);
})

/**
 * 添加响应拦截器
 */
axios.interceptors.response.use( (resp) => {
    // 2XX 范围内的状态码都会触发该函数
    // 对响应数据要做的事

    // 拦截token的验证结果，进行相应的提示和页面跳转
    if (resp.data.code > 900) {
        // code大于900说明验证未通过，进行相应的提示
        ElMessageBox.confirm(
            resp.data.msg + ', 是否重新登录?',  // 提示语
            'Warning',  // 提示框标题
            {
                confirmButtonText: '确认',
                cancelButtonText: '取消',
                type: 'warning',
            }
        ).then(() => {  // 用户点击确认按钮触发then
            // 后端校验token未通过，登录之前清理掉不合法的token
            removeToken();
            // 跳转登录页面
            window.location.href = '/';
        }).catch(() => {    // 用户点击取消按钮触发catch
            // 消息提示框
            messageTip("取消登录", "warning");
        })

        // 后端返回的结果码大于900，表明是token存在问题，只需要弹出token相关的消息提示框即可
        // 所以拦截器这里返回null，不再返回响应的信息，避免和其他消息提示框重复弹出（例如：退出登录时退出异常的消息提示框）
        return null;
    }

    return resp;
}, (error) => {
    // 超出 2XX 范围内的状态码都会触发该函数
    // 响应错误之后执行的代码
    return Promise.reject(error);
})

